﻿// pro3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int number;
    struct node * next;
}roundtable;

roundtable* initLink(int n){    //构建链表
    roundtable* head=(roundtable*)malloc(sizeof(roundtable));       //头节点申请空间
    head->number=1;             //头节点编号为1
    head->next=NULL;            //无后继
    roundtable* temp=head;      //设一个辅助节点
    for (int i=2; i<=n; i++) {  //构建后续节点
        roundtable* body=(roundtable*)malloc(sizeof(roundtable));   //后继节点申请空间
        body->number=i;         //依次记录编号
        body->next=NULL;        //无后继
        temp->next=body;        //链接上一个节点
        temp=temp->next;        //辅助节点后移
    }
    temp->next=head;            //首尾相连
    return head;                //返回头节点
}

void Outnumber(roundtable* head,int s,int m){   //输出数字编号
    roundtable* tail=head;      //尾节点从第一个节点开始找
    while (tail->next!=head) {  //向后遍历直到最后一个节点
        tail=tail->next;
    }
    roundtable* p=head;         //指针p用于找到编号为s的人
    while (p->number!=s) {      //找到s时，p指向此节点，tail指向此节点的前一个节点
        tail=p;
        p=p->next;
    }
    while (p->next!=p) {
        for (int i=1; i<m; i++) {
            tail=p;
            p=p->next;
        }
        tail->next=p->next;     //从链表上将p结点摘下来
        printf("%d ",p->number);
        free(p);
        p=tail->next;           //继续使用p指针指向出列编号的下一个编号
    }
    printf("%d",p->number);
    free(p);
}

int main() {
    int n;
    int s;
    int m;
    scanf_s("%d %d %d",&n,&s,&m);
    roundtable* head=initLink(n);
    Outnumber(head, s, m);
    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
